package work;

import cn.hutool.core.io.FileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import io.netty.channel.nio.NioEventLoopGroup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.*;

public class TableExportExcel {
//
//    private static final Logger log = LoggerFactory.getLogger(TableExportExcel.class);
//    private static final String outDir = "C:\\work-records\\z照相机\\l-数据结构整理\\excel\\";
//
//    private static final Class[] clazzs = new Class[]{
//    };
//
//    private static final NioEventLoopGroup eventExecutors = new NioEventLoopGroup();
//
//    private static final List<Class> ignoreList = Lists.newArrayList(new Class[]{
//            Integer.class,
//            String.class,
//            Double.class,
//            Date.class,
//            Boolean.class,
//            int.class,
//            boolean.class,
//            double.class,
//            float.class
//    });
//
//    public static void main(String[] args) throws InterruptedException, IOException {
//        for (Class clazz : clazzs) {
//            writeClass(clazz, outDir);
//        }
//        System.in.read();
//        eventExecutors.shutdownGracefully().sync();
//    }
//
//    private static void writeClass(Class clazz, String path) {
//        eventExecutors.execute(() -> {
//            String fileName = path + clazz.getSimpleName() + ".xlsx";
//            List<ClassFieldInfo> data = new ArrayList<>();
//            for (Field declaredField : clazz.getDeclaredFields()) {
//                ClassFieldInfo fieldInfo = getFiledInfo(declaredField, path + clazz.getSimpleName() + "\\");
//                data.add(fieldInfo);
//            }
//            EasyExcel.write(fileName, ClassFieldInfo.class).sheet().doWrite(data);
//        });
//    }
//
//    private static ClassFieldInfo getFiledInfo(Field declaredField, String path) {
//        declaredField.setAccessible(true);
//        List<ClassFieldInfo> res = new ArrayList<>();
//        String name = declaredField.getName();
//        Class<?> type = declaredField.getType();
//        String clazz = type.getSimpleName();
//        ApiModelProperty annotation = declaredField.getAnnotation(ApiModelProperty.class);
//        String des = Objects.isNull(annotation) ? name : annotation.value() + "; " + annotation.example();
//        ClassFieldInfo fieldInfo = new ClassFieldInfo(name, clazz, des);
//
//        if (!ignoreList.contains(type) && (!type.isEnum())) {
//            if (Collection.class.isAssignableFrom(type)) {
//                Class tClass = (Class) ((ParameterizedType) declaredField.getGenericType()).getActualTypeArguments()[0];
//                if (!ignoreList.contains(tClass)) {
//                    File file = FileUtil.file(path);
//                    if (!file.exists()) {
//                        file.mkdir();
//                    }
//                    writeClass(tClass, path);
//                }
//                fieldInfo.setClazz(String.format("%s<%s>", type.getSimpleName(), tClass.getSimpleName()));
//            } else {
//                File file = FileUtil.file(path);
//                if (!file.exists()) {
//                    file.mkdir();
//                }
//                writeClass(type, path);
//            }
//        }
//
//        return fieldInfo;
//    }
//
//
//    public static class ClassFieldInfo {
//        @ExcelProperty("字段名称")
//        private String filed;
//        @ExcelProperty("字段类型")
//        private String clazz;
//        @ExcelProperty("字段描述")
//        private String des;
//
//        public ClassFieldInfo(String filed, String clazz, String des) {
//            this.filed = filed;
//            this.clazz = clazz;
//            this.des = des;
//        }
//
//        public void setClazz(String clazz) {
//            this.clazz = clazz;
//        }
//
//        public String getFiled() {
//            return filed;
//        }
//
//        public String getClazz() {
//            return clazz;
//        }
//
//        public String getDes() {
//            return des;
//        }
//    }
}
